from django.contrib import admin
# 导入model
from coupon.models import CouponModel, CouponCourseDirectionModel, CouponCourseCategoryModel, CouponCourseModel, CouponLogModel
# redis
from django_redis import get_redis_connection
import json


# 方向
class CouponDirectionInline(admin.TabularInline):
    model = CouponCourseDirectionModel
    fields = ['id', 'direction']


# 分类
class CouponCategoryInline(admin.TabularInline):
    model = CouponCourseCategoryModel
    fields = ['id', 'category']


# 课程
class CouponCourseInline(admin.TabularInline):
    model = CouponCourseModel
    fields = ['id', 'course']


# 优惠劵
class CouponModelAdmin(admin.ModelAdmin):
    list_display = ['id', 'name', 'start_time', 'end_time', 'total', 'has_total', 'coupon_type', 'get_type']
    inlines = [CouponDirectionInline, CouponCategoryInline, CouponCourseInline]


admin.site.register(CouponModel, CouponModelAdmin)


# 日志   优惠劵管理
class CouponLogModelAdmin(admin.ModelAdmin):
    list_display = ['id', 'user', 'coupon', 'use_time', 'use_status']

    # 钩子函数
    def save_model(self, request, obj, form, change):
        # 在管理站点中点击保存的时候，自动触发的函数，钩子函数
        # request：本次客户操作的模型类示例对象
        # obj：本次操作的模型类
        # form: 提交的表单数据
        # change：True 表示更新数据，   False 表示添加新增数据
        obj.save()  # 保存到数据库中，mysql中
        # 同步到redis中
        redis = get_redis_connection('coupon')
        # 存哪些内容
        if obj.use_status == 0 and obj.use_time == None:
            pipe = redis.pipeline()
            pipe.multi()

            # 往redis中存数据
            # 构建数据存储类型，优惠劵中的属性，全部放到redis中
            coupon_dict = {
                'coupon_id': obj.coupon.id,
                'name': obj.coupon.name,
                'discount': obj.coupon.discount,  # 数据库实际存储的类型
                'get_discount_display': obj.coupon.get_discount_display(),
                'coupon_type': obj.coupon.coupon_type,
                'get_coupon_type_display': obj.coupon.get_coupon_type_display(),
                'get_type': obj.coupon.get_type,
                'get_get_type_display': obj.coupon.get_get_type_display(),
                'start_time': obj.coupon.start_time.strftime("%Y-%m-%d %H:%M:%S"),
                'end_time': obj.coupon.end_time.strftime("%Y-%m-%d %H:%M:%S"),
                'condition': obj.coupon.condition,
                'sale': obj.coupon.sale,
                'to_direction': json.dumps(list(obj.coupon.to_direction.values('direction__id', 'direction__name'))),
                'to_category': json.dumps(list(obj.coupon.to_category.values('category__id', 'category__name'))),
                'to_course': json.dumps(list(obj.coupon.to_course.values('course__id', 'course__name'))),
            }
            pipe.hset(f'{obj.user.id}:{obj.id}', mapping=coupon_dict)
            from datetime import datetime
            print('存入redis中的数据的key')
            print(f'{obj.user.id}:{obj.id}')
            # 根据key值，设置过期时间
            pipe.expire(f'{obj.user.id}:{obj.id}', int(obj.coupon.end_time.timestamp() - datetime.now().timestamp()))
            # 最终写入redis
            pipe.execute()
        else:
            # 如果优惠劵状态为使用过，或者是过期
            # 优惠劵的有使用事件啊in，表示使用过
            # 将数据，从redis中删除
            redis.delete(f'{obj.user.id}:{obj.id}')

    # 管理账点中，删除单条数据
    def delete_model(self, request, obj):
        # 删除单条数据
        redis = get_redis_connection('coupon')

        # 用户id：日志id
        # 删除redis中对应的数据
        redis.delete(f'{obj.user.id}:{obj.id}')
        # orm操作，删除对应模型对象
        obj.delete()

    # 管理站点中，批量删除优惠劵管理日志，删除redis中数据
    def delete_queryset(self, request, queryset):
        redis = get_redis_connection('coupon')
        # 循环删除redis中数据
        for qs in queryset:
            redis.delete(f'{qs.user.id}:{qs.id}')
        queryset.delete()


admin.site.register(CouponLogModel, CouponLogModelAdmin)